# -*- coding: utf-8 -*-

# 这里可以引用一些基础的包，如numpy/pandas/math/datetime/json/cv2/re/requests/base64/io/PIL等
# 后处理脚本完整使用说明: https://gitee.com/deeao/open-document/tree/master/%E6%96%87%E6%A1%A3%E7%BB%93%E6%9E%84%E5%8C%96/%E5%90%8E%E5%A4%84%E7%90%86%E8%84%9A%E6%9C%AC

# ************************ 通常只在测试环境使用测试状态 ***************************
# 测试状态
# 开启测试状态，可以使用 print 打印日志信息，这些信息会存储到 extract_result -> scirpt_debug 中，并且这些信息也会作为抽取值展示在界面上方便测试
# 在测试状态下，如果发生异常，则会直接返回原始抽取结果，且增加相应异常结果信息
# DEBUG = False

from typing import List


def before_return(
    images: list,
    data: list,
    filename: str = "",
    task_uuid: str = "",
    extend: str = "",
    line_texts: List[dict] = [],
    paragraph_texts: List[dict] = [],
    ocr_results: List[dict] = [],
):
    """数据返回前会调用该钩子函数进行处理

    使用前注意事项：
    1. 在该脚本提交的时候，会执行一次该函数，参数都是空值，以便在提交的时候发现问题。
    2. 所有的命名参数必须注明参数类型（如str、list等），否则无法传递参数，即函数定义必须是这样:
           def before_return(images: list, data: list, filename: str = "", task_uuid: str = "", extend: str = ""):
       如果某个可选参数是不需要的，则可以不写，例如如果task_uuid参数是不需要的，则可以不写该参数，如下:
           def before_return(images: list, data: list, filename: str = "", extend: str = ""):
    3. 对于所有可选参数，如果不需要的话，最好不要写在接口上，如果写上了就会消耗接口的性能

    使用场景：
    1. 对抽取到的值做某些处理，例如对某些值进行过滤，或者对抽取到的某些值运算等；
    2. 判断抽取到的值是否符合要求，如果符合要求则返回status=1，否则status=0，这样可以用于质检等；
    3. 可以对抽取到的值增加一些变量，或者减少一些变量，增加变量时要主要保持数据结构一致

    :param images list 文档分拆出来的图像列表，特殊情况才需要依赖图像进行计算，例如可以获取每一页的图像大小，总页数等
    :param data list 抽取得到的数据，格式如：
        [
            // 第一个抽取变量
            {
                "variable_name": "变量名",
                "data": [    // 每个抽取变量可能会抽取到多个值
                    {        // 变量对应的第一个抽取到的值
                        "type": "text",   // 值类型，支持有：text/image/table
                        "text": "",       // 当type=text时，该值为抽取到的文本，当type=image时，该值为对应图像的base64字符串
                        "tables": [       // 当type=table时，抽取到的单元格的详细信息
                            "text": [....],     // 字符串列表
                            "box": [....],
                            "cols": [],
                            "rows": [],
                        ],
                        "page": [1],      // 抽取到的值所在的页码，可能会包含多个值
                        "box": [[x1, y1, x2, y2]],  // 抽取到的值所在的box，可能会包含多个box
                        ....
                    },
                    // 更多抽取到的值
                ]
            },
            // 更多抽取变量......
        ]
    :param filename         str          [可选]文件名参数
    :param task_uuid        str          [可选]任务的UUID
    :param extend           str          [可选]扩展信息参数
    :param line_texts       List[dict]   [可选]所有的文本行的文本数据，格式如：
        [
            {
                "id": 1,
                "text": "文本内容",
                "position": [          // 文本所在的位置
                    {
                        "page": 1,
                        "box": [x1, y1, x2, y2]
                    }
                ],
            },
            // 更多文本行......
        ]
    :param paragraph_texts  List[dict]   [可选]所有的段落的文本数据，格式如：
        [
            {
                "id": "1",             // 段落的唯一ID，用于后续更新该段落的值
                "text": "文本内容",     // 段落文本
                "position": [          // 注意段落文本可能会出现在多个位置，也可能会跨页
                    {
                        "page": 1,
                        "box": [x1, y1, x2, y2]
                    }
                ],
            },
            // 更多段落......
        ]
    :param ocr_results   List[dict]   [可选]ocr识别的所有数据，如果不需要最好不要传该参数，数据比较多，文本行列表和段落列表的数据都是来源于此。数据结构具体见相关文档
    :return status   int     后处理状态，通常用于标识成功或者失败，该值会存储到数据库的machine_status字段中，该值没有统一的定义，各个文档类型可以自定义解释即可
    :return data     list    处理后的抽取数据，注意格式要和输入保持一致
    """
    status = 0

    # DEBUG=True 时，print的日志会输出到返回数据的 extract_result -> script_debug 里
    # print("测试信息")

    # 对data数据进行处理
    return status, data


if __name__ == "__main__":
    pass
